home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-28 | 7.3 KB | 249 lines | [TEXT/MPS ] |
- /*
- File: HFSTupleDatabase.cp
-
- Copyright: © 1991-1994 by Apple Computer, Inc.
- All rights reserved.
-
- Part of the AOCE Sample SMSAM Package. Consult the license
- which came with this software for your specific legal rights.
-
- */
-
-
-
- #ifndef __HFSTUPLEDATABASE__
- #include "HFSTupleDatabase.h"
- #endif
-
- #ifndef __ABSTRACTFILE__
- #include "AbstractFile.h"
- #endif
-
- #ifndef __DEBUGASSERT__
- #include "DebugAssert.h"
- #endif
-
- #ifndef __HANDLEOBJECTOWNER__
- #include "HandleObjectOwner.h"
- #endif
-
- #ifndef __BUFFER__
- #include "Buffer.h"
- #endif
-
- #ifndef __DATAITEM__
- #include "DataItem.h"
- #endif
-
- /***********************************|****************************************/
-
- #pragma segment HFSTupleDatabase
-
- /***********************************|****************************************/
-
- // Write this function since PLstrchr seems to have a bug in it and
- // (ocassionally) goes past the end of the Str255 looking for the
- // character.
- static Boolean IsInStr255 ( const StringPtr str, const char c )
- {
- for ( unsigned i = str[0]; i ; -- i )
- if ( str[i] == c )
- return true;
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean
- CanBeUsedForHFSFileName ( const StringPtr name )
- {
- Boolean result = ( name [ 0 ] >= 1 ) && ( name [ 0 ] <= sizeof ( Str32 ) && ( IsInStr255(name, ':') == false ));
-
- #if debug
- if ( result == false )
- keithDB ( "THFSTupleDatabase::CanBeUsedForHFSFileName(" << name << ") == false" );
- #endif
-
- return result;
- }
-
- /***********************************|****************************************/
-
- THFSTupleDatabase::THFSTupleDatabase ():
- ATupleDatabase (),
- fFolderSpec ()
- {
- }
-
- /***********************************|****************************************/
-
- THFSTupleDatabase::THFSTupleDatabase ( const TFolderSpec& folderSpec ):
- ATupleDatabase (),
- fFolderSpec ( folderSpec )
- {
- fFolderSpec.CreateFolder ();
- }
-
- /***********************************|****************************************/
-
- THFSTupleDatabase::~THFSTupleDatabase()
- {
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::GetTupleDataSize ( const ATupleKey& key, unsigned long &dataSize )
- {
- CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
- ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
- if (DoesTupleExist(key)) {
- return TFileSpec ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () ).GetLogicalSize ( dataSize );
- };
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::SetTuple ( const ATupleKey& key, const ADataItem& data )
- { CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
- ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
- TForkFile* file = new TForkFile ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart ());
- THandleObjectOwner owner ( file );
-
- if ( file->WriteDataIgnore ( data.GetPhysicalStart (), data.GetPhysicalLength () ) == noErr )
- { FInfo fileInfo;
-
- // Encode the data type as the file type.
- if (HGetFInfo(fFolderSpec.GetVolume(), fFolderSpec.GetID(), (StringPtr) fileNameKey.GetPhysicalStart (), &fileInfo) == noErr)
- { fileInfo.fdType = data.GetDataType();
- HSetFInfo(fFolderSpec.GetVolume(), fFolderSpec.GetID(), (StringPtr) fileNameKey.GetPhysicalStart (), &fileInfo);
- }
-
- return file->SetEnd ( data.GetPhysicalLength () ) == noErr;
- }
-
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::GetTupleData ( const ATupleKey& key, ADataItem& data )
- { CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
- ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
-
- if (DoesTupleExist(key)) {
- TForkFile* file = new TForkFile ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () );
- THandleObjectOwner owner ( file );
-
- long length = 0;
-
- if ( file->GetEnd ( length ) == noErr )
- if ( data.SetPhysicalLength ( length ) == length )
- { FInfo fileInfo;
- // Get the datatype from the file type
- if (HGetFInfo(fFolderSpec.GetVolume(), fFolderSpec.GetID(), (StringPtr) fileNameKey.GetPhysicalStart (), &fileInfo) == noErr)
- data.SetDataType(fileInfo.fdType);
- return file->ReadDataIgnore ( (void*) data.GetPhysicalStart (), length ) == noErr;
- }
- };
-
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::DeleteTuple ( const ATupleKey& key )
- { CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
- ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
- return TFileSpec ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () ).DeleteFile ();
- }
-
- /***********************************|****************************************/
-
- unsigned long
- THFSTupleDatabase::CountTuples () const
- {
- return fFolderSpec.CountChildrenFiles ();
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::GetTupleKey ( unsigned long index, ATupleKey& key )
- {
- TFileSpec file;
-
- if ( fFolderSpec.GetChildFile ( index, file ) )
- {
- StringPtr fileName = file.GetPName () ;
- key.SetData ( & fileName [ 1 ], fileName [ 0 ] );
- return true;
- }
- else
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::FindIndexOfTuple ( const ATupleKey& key, unsigned long& index ) const
- { CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
- ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
- TFileSpec keyFile ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart () );
- TFolderFileIterator iterator ( fFolderSpec );
- const TFileSpec* file;
-
- index = 1;
-
- for ( file = iterator.FirstFile ();
- file != nil;
- file = iterator.NextFile () )
- {
- if ( *file == keyFile )
- return true;
- else
- index++;
- }
-
- index = 0;
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::DeleteDatabase ()
- {
- return fFolderSpec.DeleteFolder ();
- }
-
- /***********************************|****************************************/
-
- void THFSTupleDatabase::Flush ()
- {
- }
-
- /***********************************|****************************************/
-
- ostream&
- THFSTupleDatabase::operator >> ( ostream& stream ) const
- {
- return ATupleDatabase::operator >> ( stream );
- }
-
- /***********************************|****************************************/
-
- Boolean
- THFSTupleDatabase::DoesTupleExist ( const ATupleKey& key ) const
- {
- CPrefixDataItem fileNameKey ( key.GetData(), key.GetLength(), CPrefixDataItem::kByte );
- ASSERT_RETURN_ZERO ( CanBeUsedForHFSFileName ( (const StringPtr) fileNameKey.GetPhysicalStart() ) );
- return TFileSpec ( fFolderSpec.GetVolume (), fFolderSpec.GetID (), (StringPtr) fileNameKey.GetPhysicalStart ()).DoesFileExist ();
- }
-
- /***********************************|****************************************/
-